package com.fengye.algorithms.leecode;

import com.fengye.algorithms.leecode.common.TreeNode;

import java.util.List;

/**
 * 给你两棵二叉树： root1 和 root2 。
 *
 * 想象一下，当你将其中一棵覆盖到另一棵之上时，两棵树上的一些节点将会重叠（而另一些不会）。你需要将这两棵树合并成一棵新二叉树。合并的规则是：如果两个节点重叠，那么将这两个节点的值相加作为合并后节点的新值；否则，不为 null 的节点将直接作为新二叉树的节点。
 *
 * 返回合并后的二叉树。
 *
 * 注意: 合并过程必须从两个树的根节点开始。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/merge-two-binary-trees
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @Author fengye
 * @Date 2023/4/14 7:17
 **/
public class MergeTrees617 {
    public static void main(String[] args) {
        TreeNode root1 = new TreeNode(1);
        TreeNode root2 = new TreeNode(1, new TreeNode(2), null);
        new MergeTrees617().mergeTrees(root1, root2);
    }

    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null || root2 == null) {
            if (root1 != null) {
                return root1;
            } else {
                return root2;
            }
        }
        root1.val = root1.val + root2.val;
        root1.left = mergeTrees(root1.left, root2.left);
        root1.right = mergeTrees(root1.right, root2.right);
        return root1;
    }

    /**
     * 把问题想复杂了，root1为null, 把root2直接赋值好了
     * @param root1
     * @param root2
     * @return
     */
    public TreeNode mergeTrees2(TreeNode root1, TreeNode root2) {
        if(root1 == null) {
            return root2;
        }

        if(root2 == null) {
            return root1;
        }
        TreeNode result = doDfs(root1, root2);

        return result;
    }



    public TreeNode doDfs(TreeNode root1, TreeNode root2) {
        if(root1 == null && root2 == null) {
            return null;
        }

        TreeNode result = new TreeNode();
        if(root1 != null) {
            result.val += root1.val;
        }
        if(root2 != null) {
            result.val += root2.val;
        }

        if(root1 == null && root2 != null) {
            if(root2.left != null) {
                result.left = doDfs(null, root2.left);
            }
            if(root2.right != null){
                result.right = doDfs(null, root2.right);
            }
        } else if(root1 != null && root2 == null) {
            if(root1.left != null) {
                result.left = doDfs(root1.left, null);
            }
            if(root1.right != null){
                result.right = doDfs(root1.right, null);
            }
        } else {
            if (root1.left != null && root2.left != null) {
                result.left = doDfs(root1.left, root2.left);
            }

            if (root1.left == null && root2.left != null) {
                result.left = doDfs(null, root2.left);
            }
            if (root1.left != null && root2.left == null) {
                result.left = doDfs(root1.left, null);
            }

            if (root1.right != null && root2.right != null) {
                result.right = doDfs(root1.right, root2.right);
            }

            if (root1.right != null && root2.right == null) {
                result.right = doDfs(root1.right, null);
            }

            if (root1.right == null && root2.right != null) {
                result.right = doDfs(null, root2.right);
            }
        }
        return result;
    }
}
